package cl.ccs.migracionbcmc.dao.impl;


import cl.ccs.migracionbcmc.connection.ConnectionFactory;
import cl.ccs.migracionbcmc.dao.ContratoDao;
import cl.ccs.migracionbcmc.model.Contrato;
import cl.ccs.migracionbcmc.util.Util;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Types;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class ContratoDaoImpl implements ContratoDao{
        public ContratoDaoImpl() {
        super();
    }

    /**
     * @param rut
     * @return
     * @throws Exception
     */
    @Override
    public List<Contrato> getContratos(String rut) throws Exception {
        Connection con = null;
        ResultSet rs = null;
        List<Contrato> listContrato = new ArrayList<Contrato>();
        if (rut == null) {
            return Collections.emptyList();
        }
        try {
            con = ConnectionFactory.getConnectionSybaseBIC();
            CallableStatement stm = con.prepareCall("{?=CALL SQ_ConsultaContABI_ADF(?)}");
            stm.registerOutParameter(1, Types.INTEGER);

            stm.setString(2, Util.formatRUT(rut));
            if (!stm.execute()) {
                return Collections.emptyList();
            }
            rs = stm.executeQuery();

            while (rs.next()) {
                Contrato contrato = new Contrato();
                contrato.setCorrContrato(rs.getLong("Fld_CorrContrato_Id"));
                contrato.setRutContratante(rs.getString("Fld_RutAfectado"));
                contrato.setApPaternoContratante(rs.getString("Fld_Nombre_ApPat"));
                contrato.setApMaternoContratante(rs.getString("Fld_Nombre_ApMat"));
                contrato.setNombreContratante(rs.getString("Fld_Nombre_Nombres"));
                contrato.setFecTerminoContrato(rs.getDate("Fld_FecTerminoContrato"));
                contrato.setEmail(rs.getString("Fld_Email"));
                contrato.setFlagRevisado(rs.getBoolean("Fld_Flag_Revisado"));
                contrato.setFlagLey20575(rs.getBoolean("Fld_FlagLey20575"));

                listContrato.add(contrato);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con, rs);
        }

        return listContrato;
    }

    /**
     * @param corrContrato
     * @param rut
     * @return
     * @throws Exception
     */
    @Override
    public Contrato getDetalleContrato(Long corrContrato, String rut) throws Exception{
        Connection con = null;
        ResultSet rs = null;
        Contrato contrato = new Contrato();

        if(rut == null || corrContrato == null) {
            return new Contrato();
        }
        try {
           
            con = ConnectionFactory.getConnectionSybaseBIC();
            CallableStatement stm = con.prepareCall("{?=CALL SQ_DetalleContrato_ADF(?, ?)}");
            stm.registerOutParameter(1, Types.INTEGER);
            

            stm.setLong(2, corrContrato);
            stm.setString(3, Util.formatRUT(rut));
            
            rs = stm.executeQuery();
            
            if (rs.next()) {
                contrato.setCorrContrato(rs.getLong(1)); // "Fld_CorrContrato"
                contrato.setRutContratante(rs.getString(2)); // "Fld_RutContratante"
                contrato.setApPaternoContratante(rs.getString(3)); // "c.Fld_Nombre_ApPat"
                contrato.setApMaternoContratante(rs.getString(4)); // "c.Fld_Nombre_ApMat"
                contrato.setNombreContratante(rs.getString(5)); // "c.Fld_Nombre_Nombres"

                contrato.setRutAfectado(rs.getString(6)); // "Fld_RutAfectado"
                contrato.setApPaternoAfectado(rs.getString(7)); // "a.Fld_Nombre_ApPat"
                contrato.setApMaternoAfectado(rs.getString(8)); // "a.Fld_Nombre_ApMat"
                contrato.setNombreAfectado(rs.getString(9)); // "a.Fld_Nombre_Nombres"

                contrato.setFecInicioContrato(rs.getDate(10)); // "Fld_FecInicioContrato"
                contrato.setFecTerminoContrato(rs.getDate(11)); // "Fld_FecTerminoContrato"

                contrato.setEmail(rs.getString(12)); // "Fld_Email"
                contrato.setTelefonoCelular(rs.getString(13)); // "Fld_TelefonoCelular"
                contrato.setDireccionCompleta(rs.getString(15)); // "Fld_DireccionCompleta"
                contrato.setFecActualizacion(rs.getDate(16)); // "Fld_FecActualizacion"
                contrato.setCodUsuarioAct(rs.getString(17)); // "Fld_CodUsuarioAct"

                contrato.setFlagRevisado(rs.getBoolean(18)); // "Fld_Flag_Revisado"
                contrato.setFlagLey20575(rs.getBoolean(19)); // "Fld_FlagLey20575"
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con, rs);
        }

        return contrato;
    }

    /**
     * @param corrContrato
     * @param rutAfectado
     * @param usuario
     * @return
     * @throws Exception
     */
    @Override
    public Boolean actualizaContrato(Long corrContrato, String rutAfectado, String usuario) throws Exception{
        Connection con = null;
        try {
            con = ConnectionFactory.getConnectionSybaseBIC();
            CallableStatement stm = con.prepareCall("{?=CALL SP_HabilDesCont_ADF(?, ?, ?)}");
            stm.registerOutParameter(1, Types.INTEGER);

            stm.setLong(2, corrContrato);
            stm.setString(3, Util.formatRUT(rutAfectado));
            stm.setString(4, usuario);
            
            stm.execute();
            
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            ConnectionFactory.freeConnection(con);
        }      
        return true;
    }

}